qt和matlab进程通信,用QtCharts绘制动态折线图

您所在的位置:网站首页 matlab if怎么用 qt和matlab进程通信,用QtCharts绘制动态折线图

qt和matlab进程通信,用QtCharts绘制动态折线图

#qt和matlab进程通信,用QtCharts绘制动态折线图| 来源: 网络整理| 查看: 265

一. 内容简介

qt和matlab进程通信,获取matlab中实时计算数据,用QtCharts绘制动态折线图。 这个通信可以借鉴linux中进程通信的原理,管道通信,那么我们可以用txt文件来当作管道,给C++和matlab通信用。

二. 软件环境 2.1QT 5.14.1

QT编译器采用的是MSVC2017 64bit

2.2MatlabR2022b(64位) 2.3Visual studio 2017

Visual stdio采用2017主要是因为QT5.14.1最高到MSVC2017 64bit。

三.主要流程 3.1 qt使用QtCharts绘制折线图 3.2 matlab中写数据 3.3 折线图实时更新 3.4 结果展示 四.具体步骤 4.1 qt使用QtCharts绘制折线图

在项目中使用charts模块,必须要在项目中配置文件.pro中增加下面一行语句

QT += charts

头文件

#include #include #include #include #include #include QT_CHARTS_USE_NAMESPACE #include #include #include #include #include #include

搭建二维显示模块,ui文件中添加Graphics View,然后提升为图中的就可以了。 在这里插入图片描述 在这里插入图片描述 二维框架,

void MainWindow::CreatCharts() { qchart = new QChart; //把chart放到容器里 ui->charts->setChart(qchart); //设置抗锯齿 ui->charts->setRenderHint(QPainter::Antialiasing); //创建两条线 ser0 = new QLineSeries; //设置名字 ser0->setName("ser0"); //放入charts里 qchart->addSeries(ser0); //创建x坐标 QValueAxis *Qax = new QValueAxis; Qax->setTickCount(11); //设置范围 Qax->setRange(0,1); //创建y坐标 QValueAxis *QaY = new QValueAxis; //设置范围 QaY->setRange(-6,0); QaY->setTickCount(11); //将线条放入表中 qchart->setAxisX(Qax,ser0); qchart->setAxisY(QaY,ser0); } 4.2 matlab中写数据

这样子循环记录数据

fileID = fopen('data.txt','w'); t1=clock; while t2=clock; if etime(t2,t1)>=0.1 t1 = clock; fprintf(fileID,'%d %f %f\n',aaaa,log10(sss),log10(ss)); end end fclose(fileID); 4.3 折线图实时更新

这里可以给二维框架更新一下 头文件

QValueAxis *curAxis; //当前坐标轴 QValueAxis *curAyis; //当前坐标轴 QTimer * timer; QLineSeries *ser0; QLineSeries *ser1; QChart *qchart; int minnnn=0; int maxxxx=0; int i=0; int moddd; // 初始化一个图表对象 qchart = new QChart; ui->chartView->setChart(qchart); // 设置抗锯齿 ui->chartView->setRenderHint(QPainter::Antialiasing); // 创建两条线 ser0 = new QLineSeries; ser1 = new QLineSeries; // 设置名字 ser0->setName("压力残差"); ser1->setName("温度残差"); // 放入charts里 qchart->addSeries(ser0); qchart->addSeries(ser1); // 创建x坐标 QValueAxis *Qax = new QValueAxis; Qax->setTickCount(11); // 设置范围 Qax->setRange(0, 10); curAyis = Qax; // 创建y坐标 QValueAxis *QaY = new QValueAxis; // 设置范围 QaY->setRange(-1, 0); QaY->setTickCount(11); curAxis=QaY; // 将线条放入表中 qchart->setAxisX(Qax, ser0); qchart->setAxisY(QaY, ser0); qchart->setAxisX(Qax, ser1); qchart->setAxisY(QaY, ser1); curAyis->setLabelFormat("%d"); curAxis->setLabelFormat("%.1f"); // 加个时钟 timer = new QTimer; timer->setInterval(100); // 这个连接创建多次,就会响应多次, connect(timer, SIGNAL(timeout()), this, SLOT(RefreshTime_Slot())); timer->start();

绑定的事件

void MainWindow::RefreshTime_Slot() { // 输出信息至文件中(读写、追加形式) QString sss; int step; float cc1; float cc2; QFile file("data.txt"); file.open(QIODevice::ReadOnly); double aaa = 0, bbb = 0; int mmm; int aaa1 = 0, bbb1 = 0; if (file.isOpen()) { i = 0; ser0->clear(); ser1->clear(); QByteArray array; while (!file.atEnd()) // 判断是否读到文件尾 { array = file.readLine(); // 按行读,追加 i++; sss = array; sscanf(sss.toStdString().c_str(), "%d %f %f", &step, &cc1, &cc2); if ((moddd == 3) || (moddd == 4)) { ser0->append(step, cc1); ser1->append(step, cc2); if (step >= aaa) { aaa = aaa + (int)(step * 0.2); // aaa = aaa + 150; qchart->axisX()->setMax(aaa); } int mmmmmm = ((int)cc1/0.5); if(mmmmmm ser0->append(step, cc1); if (step >= aaa) { aaa = aaa + (int)(step * 0.2); // aaa = aaa + 150; qchart->axisX()->setMax(aaa); } int mmmmmm = ((int)cc1/0.5); if(mmmmmm


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3